En este informe se detallan los procesos de clustering efectuacos por el equipo en las bases de datos de partidos de selecciones nacionales desde el año 1993 hasta el 2018, que muestran información del ránking de los equipos juntos con variables que cuenten sobre la racha que llevan.
Por otro lado, se presenta una nueva base de datos que contiene información exclusivamente relacionado a partidos disputados en copas del mundo, desde 1930 hasta 2018. En esta oportunidad se posee información sobre la fase del partidos, el público asistente, y datos, bastante interesantes, como lo son las nacionalidades de los árbitros, y el marcador al primer tiempo.
En esta sección se cargan las base de dato correspodiente a los partidos de selecciones nacionales desde el año 1993 en todo tipo torneo, incluyendo la variable que cuenta sobre el ránking de los equipos en disputa.
BD <- read.csv("BaseCOMPLETA.csv",sep=";")
BD <- BD[,-1]
head(BD,5)
## date home_team away_team home_score away_score
## 1 08-08-1993 Bolivia Uruguay 3 1
## 2 08-08-1993 Brazil Mexico 1 1
## 3 08-08-1993 Ecuador Venezuela 5 0
## 4 08-08-1993 Guinea Sierra Leone 1 0
## 5 08-08-1993 Paraguay Argentina 1 3
## tournament city country neutral Rankinglocal
## 1 FIFA World Cup qualification La Paz Bolivia FALSE 59
## 2 Friendly Maceió Brazil FALSE 8
## 3 FIFA World Cup qualification Quito Ecuador FALSE 35
## 4 Friendly Conakry Guinea FALSE 65
## 5 FIFA World Cup qualification Asunción Paraguay FALSE 67
## RankingVisita VictoriaLocal VictoriaVisita RachaLocal RachaVisita Empate
## 1 22 1 0 0 0 0
## 2 14 0 0 0 0 1
## 3 94 1 0 0 0 0
## 4 86 1 0 0 0 0
## 5 5 0 1 0 0 0
## Clase ultimo HistoriaLocal HistoriaVisita
## 1 1 0 0 0
## 2 3 0 0 0
## 3 1 0 0 0
## 4 1 0 0 0
## 5 2 0 0 0
Se carga una base de datos con los atributos procesados previamente, teniendo:
AtributosSelecciones <- read.csv("Atributos.csv")
Un primer análisis sobre los datos existentes ( Revisar Hito 1 para más detalles).
length(unique(BD$home_team))
## [1] 281
length(unique(BD$away_team))
## [1] 280
length(unique(BD$country))
## [1] 232
length(unique(BD$tournament))
## [1] 69
length(unique(BD$city))
## [1] 1587
mean(BD$home_score)
## [1] 1.652711
mean(BD$away_score)
## [1] 1.10018
Se procede a realizar clustering para estos datos buscando identificar grupos de partidos con características similares
Se inicia realizando un gráfico elbow para determinar la cantidad de cluster a formar en función de este metodo.
tot_withinss <- map_dbl(1:12, function(k){
model <- kmeans(x = AtributosSelecciones[,-c(1,2,3,4,13,14)], centers =k)
model$tot.withinss
})
elbow_df <- data.frame(
k = 1:12 ,
tot_withinss = tot_withinss
)
# Plot the elbow plot
ggplot(elbow_df, aes(x = k, y = tot_withinss)) +
geom_line() +
scale_x_continuous(breaks = 1:12)+labs(title="Elbow")
Es así que se opta por realizar cuatro cluster.
set.seed(22)
modelkmSeleccion <- kmeans(AtributosSelecciones[,-c(1,2,3,4,13,14)],center=4, nstart = 20)
Cluster<- modelkmSeleccion$cluster
ClusteringKMSeleccion <- mutate(AtributosSelecciones,cluster=Cluster)
modelkmSeleccion$centers
## neutral Rankinglocal RankingVisita RachaLocal RachaVisita ultimo
## 1 0.2219273 114.34688 45.89751 0.4360964 0.7692936 1.467742
## 2 0.3166624 138.97550 144.99311 0.4924726 0.4536872 1.372034
## 3 0.3127061 27.44902 29.34162 0.9657621 0.9062896 1.404514
## 4 0.2270367 47.56230 113.13918 0.8200879 0.4081470 1.258986
## HistoriaLocal HistoriaVisita
## 1 0.1553199 0.4083145
## 2 0.3152880 0.2677828
## 3 0.2774420 0.2574004
## 4 0.4244062 0.1572893
De los cluster formados, se tiene que el primer cluster corresponde a partidos en donde el equipo local tiene un ranking peor que el ranking del equipo visitante, junto con que el equipo en calidad de visita viene con mejor racha. En el segundo cluster, ambos equipos no poseen un buen ranking, ni vienen con buena racha. En el cluster número tres, las dos selecciones tienen un ranking alto, y vienen con buena racha. En el último cluster el equipo local tiene un mucho mejor que ranking que el visitante, y también viene con mejor racha.
ggplot(ClusteringKMSeleccion,aes(x=Rankinglocal,y=RankingVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Ranking equipo local vs Ranking equipo visitante", x="Ranking equipo local", y="Ranking equipo visitante", col="Cluster")
ggplot(ClusteringKMSeleccion,aes(x=Rankinglocal,y=HistoriaVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Ranking equipo local vs Historia equipo visitante", x="Ranking equipo local", y="Historia equipo visitante", col="Cluster")
ggplot(ClusteringKMSeleccion,aes(x=RankingVisita,y=HistoriaLocal, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Ranking equipo visitante vs Historia equipo local", x="Ranking equipo visitante", y="Historia equipo local", col="Cluster")
ggplot(ClusteringKMSeleccion,aes(x=RachaLocal,y=RankingVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo local vs Ranking equipo visitante", x="Racha equipo local", y="Ranking equipo visitante", col="Cluster")
De las anteriores gráficas se evidencia la existencia de grupos de partidos, y que estos atributos tienen potencial para describir y predecir el resultado de un partido.
En esta seccion se estudia el comportamiento que tienen las selecciones al estar disputando una Copa del Mundo, máximo torneo de fútbol a nivel mundial.
Esta base de datos no contiene información del ránking puesto que aquello se implementó en el año 1993, por lo que para los datos anteriores a esa fecha no existía una calificación. Por contra parte se cuenta con información sobre los marcadores al primer tiempo, y la instancia en la cual se está jugando.
data <- read.csv("BD_Mundial.csv",sep=";")
data <- data[,-c(1)]
head(data,6)
## home_team away_team home_score away_score year X date
## 1 USA Switzerland 1 1 1994 18276 18-06-1994
## 2 Algeria Northern Ireland 1 1 1986 14105 03-06-1986
## 3 Algeria Spain 0 3 1986 14137 12-06-1986
## 4 Argentina Bulgaria 2 0 1986 14130 10-06-1986
## 5 Argentina England 2 1 1986 14153 22-06-1986
## 6 Argentina Germany 3 2 1986 14159 29-06-1986
## tournament city country neutral VictoriaLocal VictoriaVisita
## 1 FIFA World Cup Pontiac USA 0 0 0
## 2 FIFA World Cup Guadalajara Mexico 1 0 0
## 3 FIFA World Cup Monterrey Mexico 1 0 1
## 4 FIFA World Cup Mexico City Mexico 1 1 0
## 5 FIFA World Cup Mexico City Mexico 1 1 0
## 6 FIFA World Cup Mexico City Mexico 1 1 0
## RachaLocal RachaVisita Fecha Hora Stage
## 1 1 0 18-jun-94 11:30 Group A
## 2 0 1 03-jun-86 12:00 Group D
## 3 0 1 12-jun-86 12:00 Group D
## 4 0 0 10-jun-86 12:00 Group A
## 5 2 2 22-jun-86 12:00 Quarter-finals
## 6 4 1 29-jun-86 12:00 Final
## Stadium City Win.conditions Attendance
## 1 Pontiac Silverdome Detroit <NA> 73425
## 2 Tres de Marzo Guadalajara <NA> 22000
## 3 Tecnologico Monterrey <NA> 23980
## 4 Estadio Ol�mpico Universitario Mexico City <NA> 65000
## 5 Estadio Azteca Mexico City <NA> 114580
## 6 Estadio Azteca Mexico City <NA> 114600
## Half.time.Home.Goals Half.time.Away.Goals Referee
## 1 1 1 LAMOLINA Francisco Oscar (ARG)
## 2 0 1 BUTENKO Valeri (RUS)
## 3 0 1 TAKADA Shizuo (JPN)
## 4 1 0 ULLOA MORERA Berny (CRC)
## 5 0 0 BENNACEUR Ali (TUN)
## 6 1 0 ARPPI FILHO Romualdo (BRA)
## Referee.Nac Assistant.1 Assistant.1.Nac
## 1 ARG TAIBI Ernesto (ARG) ARG
## 2 RUS DAINA Andre (SUI) SUI
## 3 JPN PICON-ACKONG Edwin (MRI) MRI
## 4 CRC ARPPI FILHO Romualdo (BRA) BRA
## 5 TUN ULLOA MORERA Berny (CRC) CRC
## 6 BRA FREDRIKSSON Erik (SWE) SWE
## Assistant.2 Assistant.2.Nac RoundID MatchID
## 1 ZARATE Venancio (PAR) PAR 337 3051
## 2 PETROVIC Zoran (SRB) SRB 308 379
## 3 ESPOSITO Carlos (ARG) ARG 308 378
## 4 MARTINEZ BAZAN Jose Luis (URU) URU 308 389
## 5 DOTCHEV Bogdan (BUL) BUL 714 392
## 6 ULLOA MORERA Berny (CRC) CRC 3467 393
## Home.Team.Initials Away.Team.Initials ultimo clase Empate HistoriaLocal
## 1 USA SUI 0 3 1 0
## 2 ALG NIR 0 3 1 0
## 3 ALG ESP 0 2 0 0
## 4 ARG BUL 1 1 0 1
## 5 ARG ENG 2 1 0 0
## 6 ARG FRG 2 1 0 0
## HistoriaVisita Horario
## 1 0.0 1
## 2 0.0 1
## 3 0.0 1
## 4 0.0 1
## 5 1.0 1
## 6 0.5 1
Es así que se visualizan las principales variables que posee el dataset.
length(unique(data$home_team))
## [1] 76
length(unique(data$away_team))
## [1] 77
length(unique(data$country))
## [1] 16
length(unique(data$Stage))
## [1] 23
length(unique(data$Referee.Nac))
## [1] 83
mean(data$Half.time.Home.Goals)
## [1] 0.6330935
mean(data$Half.time.Away.Goals)
## [1] 0.5155875
mean(data$home_score)
## [1] 1.586331
mean(data$away_score)
## [1] 1.263789
data$first <- 0
for ( i in 1:nrow(data)){
if(data$Half.time.Home.Goals[i]-data$Half.time.Away.Goals[i]>0) {data$first[i]=1}
else if(data$Half.time.Home.Goals[i]-data$Half.time.Away.Goals[i]<0) {data$first[i]=2}
else if(data$Half.time.Home.Goals[i]-data$Half.time.Away.Goals[i]==0) {data$first[i]=3}
}
data$vuelta <- "No cambio"
# 0 no
# 1 ganaba visita, gano local
# 2 ganaba local, gano visita
# 3 ganaba local, empataron
# 4 ganaba vista, empataron
# 5 empataba, gano local
# 6 empataba, gana visita
for ( i in 1:nrow(data)){
if ( data$clase[i]==1 & data$first[i]==2){data$vuelta[i]="Ganaba visita, ganó local"}
else if (data$clase[i]==2 & data$first[i]==1){data$vuelta[i]="Ganaba local, ganó visita"}
else if (data$first[i]==1 & data$clase[i]==3){data$vuelta[i]="Ganaba local, empataron"}
else if (data$first[i]==2 & data$clase[i]==3){data$vuelta[i]="Ganaba vista, empataron"}
else if (data$first[i]==3 & data$clase[i]==1){data$vuelta[i]="Empataban, ganó local"}
else if (data$first[i]==3 & data$clase[i]==2){data$vuelta[i]="Empataban, ganó visita"}
}
ggplot(data = data) +
aes(x = vuelta) +
geom_bar(fill = "#0c4c8a") +
theme_minimal() + theme(axis.text.x = element_text(angle = 90, hjust = 1))
Se carga una base de datos con los atributos procesados anteriormente, dejando exclusivamente las variables que se consideran relevantes en la conformación de un partido:
rm(BD)
AtributosMundial <- read.csv("AtributosMundial.csv",sep=";")
AtributosMundial <- AtributosMundial[,-c(2,3,4,5,6,7,11,12,13,17,18,19,21,22,28,1)]
boxplot(AtributosMundial[,2:3], main= "Rachas")
boxplot(AtributosMundial[,4], main="Asistencia")
boxplot(AtributosMundial[,5:6], main="Goles al primer tiempo")
boxplot(AtributosMundial[,8:9], main="Historia ")
De las anteriores gráficas se observa cierta similitud, en los datos destacándose ciertos “outliers”. En particular, se detecta la existencia de equipos con muy buenas rachas lo que podría ser gatillante en el posterior resultado del partido. Existen partidos con una asistencia muy alta, que puede denotar instancias como finales, o partidos en donde los equipos son muy populares. En cuanto a la historia entre los equipos, tienden a tener una baja cantidad de triunfos, mostrando, sin embargo cierta superioridad de agunos equipos.
Se inicia realizando un gráfico elbow para determinar la cantidad de cluster a formar en función de este metodo
tot_withinss <- map_dbl(1:12, function(k){
model <- kmeans(x = AtributosMundial[,-c(4,13,14,15,16)], centers =k)
model$tot.withinss
})
elbow_df <- data.frame(
k = 1:12 ,
tot_withinss = tot_withinss
)
# Plot the elbow plot
ggplot(elbow_df, aes(x = k, y = tot_withinss)) +
geom_line() +
scale_x_continuous(breaks = 1:12)+labs(title="Elbow")
Por lo que se realizan tres cluster, dado que gráficamente existe un quiebre en \(k=3\).
set.seed(22)
modelkm <- kmeans(AtributosMundial[,-c(4,13,14,15,16)],center=3, nstart = 20)
ClusterKM<- modelkm$cluster
ClusteringKM <- mutate(AtributosMundial,cluster=ClusterKM)
modelkm$centers
## neutral RachaLocal RachaVisita Half.time.Home.Goals
## 1 0.8636364 4.7575758 0.9545455 0.6136364
## 2 0.8765009 0.5283019 0.3602058 0.6535163
## 3 0.8151261 1.2268908 4.0756303 0.5546218
## Half.time.Away.Goals ultimo HistoriaLocal HistoriaVisita Horario
## 1 0.3712121 0.6893939 0.2064394 0.13118687 1.954545
## 2 0.5008576 0.4957118 0.1467982 0.09033734 2.070326
## 3 0.7478992 0.7478992 0.1498599 0.20028011 1.882353
## Fase Extra
## 1 2.727273 0
## 2 2.317324 0
## 3 3.411765 0
De lo anterior se visualiza la composición de los cluster, en donde se aprecia que el tercer cluster corresponde a partidos en donde el equipo visitante viene con una buena racha, mientras que el equipo local no. Lo que ocasiona que los goles al primer tiempo sean mayores para el equipo visitante. Este tipo de partidos se disputa comúnmente en fases altas del torneo.
El segundo cluster corresponde a partidos en donde ninguno de los dos equipos posee una buena racha, es decir, vienen con mal desempeño en los últimos partidos. En este grupo de partidos, suelen convertir más goles al primer tiempo los equipos locales.
En el primer cluster el equipo local es el equipo que posee un mejor desempeño, lo que a su vez se refleja en que posee, en promedio, más goles al primer tiempo.
ggplot(ClusteringKM,aes(x=RachaLocal,y=Half.time.Away.Goals, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo local vs Cantidad de goles al primer tiempo equipo visitante", x="Racha local", y="Goles al primer tiempo equipo visitante", col="Cluster")
ggplot(ClusteringKM,aes(x=RachaVisita,y=Half.time.Home.Goals, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo visita vs Cantidad de goles al primer tiempo equipo local", x="Racha visita", y="Goles al primer tiempo equipo local", col="Cluster")
ggplot(ClusteringKM,aes(x=RachaLocal,y=HistoriaVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo local vs Historia equipo visitante", x="Racha local", y="Historia equipo visitante", col="Cluster")
ggplot(ClusteringKM,aes(x=RachaLocal,y=RachaVisita, col=as.factor(cluster) ))+ geom_jitter() +labs(title = "Racha equipo local vs Racha equipo visitante", x="Racha local", y="Racha equipo visitante", col="Cluster")
Es así, que de los anteriores gráficos se visualiza claramente la composición de cada grupo de partidos, lo que da los primeros acercamientos de una posibilidad de usar estos atributos para clasificar los partidos.